home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (DO)
/
Nibble Volume 09, No. 11 (1988-11)(MicroSPARC)(Side B).zip
/
Nibble Volume 09, No. 11 (1988-11)(MicroSPARC)(Side B).do
/
T.RECALL.s
< prev
next >
Wrap
Text File
|
1996-12-24
|
5KB
|
107 lines
********************************
* RECALL SOURCE CODE *
* BY DOUG MEEK *
* COPYRIGHT(C) 1988 *
* MICROSPARC, INC. *
* CONCORD, MA 01742 *
* MERLIN ASSEMBLER *
********************************
CONT@R EQU $92 ;ASCII CODE FOR CONTROL 'R'
CONT@E EQU $85 ;ASCII CODE FOR CONTROL 'E'
DOSJSR EQU $9EAF ;DOS JSR TO INPUT HOOK
BASL EQU $28 ;TEXT LINE BASE ADDRESS
COUT EQU $9FC5 ;A JUMP TO OUTPUT HANDLER
RDCHAR EQU $9EBA ;A JUMP TO INPUT HANDLER
BELL2 EQU $FBE4 ;BELL WITH DURATION 'Y'
IN EQU $200 ;NORMAL INPUT BUFFER
RD80VID EQU $C01F ;READ VIDEO MODE SWITCH
OURCH EQU $57B ;80 COLUMN CH
BUFF EQU $280 ;OUR BACKUP BUFFER
CH EQU $24 ;40 COLUMN CH
YSAVE EQU $AA5B ;DOS Y REGISTER SAVE
ASAVE EQU $AA5C ;DOS A REGISTER SAVE
XSAVE EQU $AA5A ;DOS X REGISTER SAVE
IDBYTE EQU $FBB3
ORG $300
INIT LDA #<INTCPT ;ALTER DOS TO ROUTE ITS INPUT
STA DOSJSR ;THROUGH THIS ROUTINE
LDA #>INTCPT ;BY REDIRECTING ITS CALL TO
STA DOSJSR+1 ;THE MONITOR INPUT HANDLER
INITRET RTS
REMOVE LDA #<RDCHAR ;RESTORE ORIGIONAL DOS JSR
STA DOSJSR ;TO THE INPUT HANDLER AND
LDA #>RDCHAR ;BYPASS THIS ROUTINE
STA DOSJSR+1
RTS
INTCPT JSR RDCHAR ;GET INPUT THROUGH NORMAL
STA ASAVE ;INPUT ROUTINE AND SAVE IT
CMP #$8D ;<RETURN> END OF THE INPUT LINE
BEQ DONE ;SAVE THE NEW LINE IN THE BUFFER
CMP #CONT@R ;<^R> REPEAT LAST COMMAND ENTERED
BEQ DOLAST ;IN ITS ENTIRETY
CMP #CONT@E ;<^E> REPEAT LAST COMMAND ENTERED
BEQ DOLAST ;ONE CHARACTER AT A TIME
LDX XSAVE ;THIS IS THE COUNT OF CHARACTERS
CPX #120 ;ENTERED - IF 120 OR GREATER WARN
BLT BACK ;THE USER THEY ARE NEARING THE
LDY #$15 ;LIMIT BY CLICKING THE SPEAKER
PHA ;SAVE ENTERED CHARACTER ON STACK
JSR BELL2
PLA ;RESTORE ENTERED CHARACTERED
JMP BACK ;TO CALLER WITH CHAR ENTERED
DONE LDY XSAVE ;GET INPUT LENGTH
BEQ BACK ;ONLY RETURN SO DON'T ALTER LAST
STY LEN ;AND SAVE IT FOR FUTURE REFERENCE
BMI BACK ;IF LENGTH IS GREATER THAN 127
PHA ;WE CAN'T SAVE INPUT FOR REPEAT
STA BUFF,Y ;OTHERWISE INPUT -> TEMPLATE
DEY ;STARTING WITH RETURN CHARACTER
MOVE LDA IN,Y ;AND MOVING BACK TO BEGINNING
STA BUFF,Y
DEY
BPL MOVE
PLA ;RESTORE RETURN CHARACTER
BACK LDX XSAVE ;SET X FOR RETURN TO CALLER
LDY CH ;AND SET CH
RTS
DOLAST LDY LEN ;IF LENGTH WAS 128 OR MORE CAN'T
BMI BACK ;REPEAT LAST CAUSE ITS LOST
BEQ BACK ;THIS MEANS NO COMMAND IN BUFFER
DOLAST1 LDY XSAVE ;MOVE LAST COMMAND FROM BUFFER TO
LDA BUFF,Y ;THE INPUT BUFFER
CMP #$8D ;CHECK FOR END OF INPUT LINE
BEQ INTEXP ;AND QUIT THERE
STA $200,Y ;OTHERWISE MOVE & PRINT TO SCREEN
LDY CH ;ALL CHARACTERS
JSR COUT
INC XSAVE ;INCREMENT THE CHARACTER COUNT SO
LDA ASAVE ;CALLER KNOWS LENGTH
CMP #CONT@E ;<^E> IF SINGLE CHARACTER REPEAT
BNE DOLAST1 ;STOP WITH ONE REPEATED CHARACTER
INTEXP LDX XSAVE ;RETURN WITH X SET TO LENGTH
LDY CH ;Y SET TO HORIZONTAL POSITION
BIT IDBYTE ;CHECK FOR II+ OR IIe
BMI IIPLUS ;IF SET ITS A II+
BIT RD80VID ;IF 80 WAS ACTIVE IT SET 'CH' TO '0'
BPL M40 ;HIGH BIT '0' MEANS 40 COLUMN
LDY OURCH ;80 ACTIVE SO SET TO 80 COL CH
STY CH ;SO CALLER KNOWS WHERE WE WERE
M40 STY YSAVE ;SAVE 'Y' BEFORE RETURN
LDA (BASL),Y ;RETURN WITH THE SCREEN CHARACTER
JMP INTCPT ;BACK TO INPUT FOR NEXT CHAR
IIPLUS STY YSAVE ;HERE FOR A II+ BEFOR RETURN
LDA (BASL),Y ;SCREEN CHARACTER FOR RETURN
PHA ;SAVE AS IS FOR LATER
AND #$3F ;MAKE POSITIVE ASCII
ORA #$40 ;AND FLASHING
STA (BASL),Y ;FOR CURSOR POSITION
PLA ;AND RETURN WITH THE ORIGIONAL
JMP INTCPT
LEN DFB 0 ;STORAGE FOR LAST COMMAND LENGTH